package com.culture.bootdemo.utils;

import java.util.*;

/**
 * @Author: wenjl
 * @Description:
 * @Date: 2021/3/5 13:56
 */
public class ListSelfUtil {

    /**
     * 将大list拆成小list。不够数量的，最后两个合并
     *
     * @param source       初始list
     * @param splitItemNum 按每个集合多少数量进行拆分
     * @param <T>
     * @return
     */
    public static <T> List<List<T>> averageAssign(List<T> source, int splitItemNum) {
        List<List<T>> result = new ArrayList<List<T>>();

        if (source != null && source.size() > 0 && splitItemNum > 0) {
            if (source.size() <= splitItemNum) {
                // 源List元素数量小于等于目标分组数量
                result.add(source);
            } else {
                // 计算拆分后list数量
                int splitNum = (source.size() / splitItemNum);
                List<T> value = null;
                for (int i = 0; i < splitNum; i++) {
                    if (i < splitNum - 1) {
                        value = source.subList(i * splitItemNum, (i + 1) * splitItemNum);
                    } else {
                        // 最后一组
                        value = source.subList(i * splitItemNum, source.size());
                    }

                    result.add(value);
                }
            }
        }

        return result;
    }


    /**
     * @param source      a集合
     * @param destination b集合
     * @param <T>
     * @return a集合减去 b集合里有的（即：对a进行过滤，滤掉b在a中存在的数据）
     * 缺点： 大数据量情况下比较耗内存，
     */
    public static <T> List<T> removeAllASubtractB(List<T> source, List<T> destination) {
        List<T> result = new LinkedList<T>();
        Set<T> destinationSet = new HashSet<T>(destination);
        for (T t : source) {
            if (!destinationSet.contains(t)) {
                result.add(t);
            }
        }
        return result;
    }

}
